#ifndef WRITER_H
#define WRITER_H

#include <windows.h>
#include <gl/gl.h>
#include <stdio.h>
#include "singleton.h"

//! Klasa umozliwiajaca pisanie po ekranie przy uzyciu czcionek bitmapowych.
class Writer
{
	friend class Singleton< Writer >;


 public:

	//! Tworzy nowa czcionke.
	/*
		Kolejne (po piewrwszym) wywolania NewFont powoduja stworzenie nowej czcionki na miejsce juz istniejacej.<BR>
		NewFont powinno byc wywolane po stworzeniu okna (wywolaniu EstablishWindow), w przeciwnym wypadku program zakonczy dzialanie.<BR>

		\param fontName nazwa Windowsowej czcionki juz zainstalowanej.
	*/
	void AddNewFont( /*const HDC hDC,*/ const char* fontName, const int fontSize);

	//! Wywolujemy gdy juz nie potrzebujemy czcionki. 
	/*
		Jesli czcionka nie zostala stworzona, wywolanie tej funkcji nie ma efektu.
	*/
	void DeleteFont()
	{
		if( initializationState != FONT_CREATED )
			return;

		glDeleteLists(base, 96);	
	}

	//! Dziala identycznie jak printf za wyjatiem tego, ze pierwsze dwa parametry to pozycja tekstu.
	/*
		Wspolrzedne czcionki przetrzymywane sa w eye coordinates. Oznacza to ze podlegaja wszystkim przeksztalceniom jak zwykle obiekty ktore rysujemy.<BR>
		Jesli czcionka nie zostala stworzona, wywolanie tej funkcji nie ma efektu.<BR>
	*/
	void Print( const float textX, const float textY, const char* fmt, ... );

 private:

	enum INITIALIZATION_STATE { FONT_NOT_CREATED, FONT_CREATED };
	INITIALIZATION_STATE initializationState;

	int base;

	void EmergencyExit( const char* str );

	Writer() : base(-1), initializationState( FONT_NOT_CREATED )
	{ }
	Writer(const Writer&) { }
	Writer& operator = (const Writer&) { }

};

#define WriterAPI Singleton< Writer >::Instance()

#endif 